package com.sensetime.jv.service;


import com.sensetime.jv.util.RedisCache;
import com.sensetime.jv.util.RedisLock;
import com.sensetime.jv.vo.request.WhiteUrlRequestVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 白名单
 */
@Service
public class WhiteUrlCacheService {

    @Value("${redis.cache.custom.whiteUrl}")
    // Redis键前缀（避免键冲突）
    private String WHITE_URL_KEY;       // 存储白名单路径的值
    @Value("${redis.cache.custom.whiteUrlLock}")
    private String whiteUrlLock;       // 存储白名单路径的值



    @Value("${server.servlet.context-path:null}")
    private String servletPath;


    @Autowired
    private RedisCache redisCache;  // 注入Redis工具类


    /**
     * 服务每次重启时
     *
     * 1.传入白名单到redis中检查是否已经存在，如果新传入的存在而redis中不存在，则添加
     * 2.如果两者都存在则不添加
     * 3.如果whiteUrl没有而redis中存在，且前缀和servletPath吻合，则从redis中删除这条白名单url
     *
     * @param whiteUrl 应用配置的白名单路径列表
     */
    /**
     * 服务每次重启时同步白名单到 Redis
     */
    /**
     * 服务每次重启时同步白名单到 Redis
     */
    /**
     * 服务每次重启时同步白名单到 Redis
     */
    public void cacheWhiteUrls(List<WhiteUrlRequestVO> whiteUrl) {
        RedisLock.executeWithLock(whiteUrlLock,()->cacheWhiteUrlsBusiness(whiteUrl));
    }

    private void cacheWhiteUrlsBusiness(List<WhiteUrlRequestVO> whiteUrl) {
        String redisKey = WHITE_URL_KEY;
        // 获取 Redis 中现有的白名单
        Set<WhiteUrlRequestVO> existingUrls = redisCache.getCacheObject(redisKey);
        if (existingUrls == null) {
            existingUrls = new HashSet<>();
        }else {
            existingUrls.removeIf(item->Objects.equals(servletPath,item.getServletPath())&&!whiteUrl.contains(item));
        }
        existingUrls.addAll(whiteUrl);
        redisCache.setCacheObject(WHITE_URL_KEY,existingUrls);
    }
    /**
     * 获取所有的白名单路径
     */
    public List<WhiteUrlRequestVO> getWhiteUrls() {
        String redisKey = WHITE_URL_KEY;
        Set<WhiteUrlRequestVO> whiteUrls = redisCache.getCacheObject(redisKey);
        return whiteUrls != null ? new ArrayList<>(whiteUrls) : Collections.emptyList();
    }
}
